import 'package:flutter/material.dart';

class LargeBackgroundImage extends StatefulWidget {
  const LargeBackgroundImage({super.key});

  @override
  _LargeBackgroundImageState createState() => _LargeBackgroundImageState();
}

class _LargeBackgroundImageState extends State<LargeBackgroundImage> {
  final TransformationController _transformationController = TransformationController();
  final String imagePath = 'assets/images/bg.png';

  // 图片的物理像素尺寸
  final double imagePhysicalWidth = 3100.0;
  final double imagePhysicalHeight = 3086.0;

  // 图片在Flutter中应使用的逻辑像素尺寸 (将在 didChangeDependencies 中计算)
  double _logicalImageWidth = 0.0;
  double _logicalImageHeight = 0.0;

  // 标记是否已初始化尺寸，避免重复计算
  bool _dimensionsInitialized = false;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();

    // 确保只初始化一次，并且在 context 有效时
    if (!_dimensionsInitialized && mounted) {
      // 获取当前设备的 Device Pixel Ratio
      final dpr = MediaQuery.of(context).devicePixelRatio;

      // 计算图片应占用的逻辑像素
      _logicalImageWidth = imagePhysicalWidth / dpr;
      _logicalImageHeight = imagePhysicalHeight / dpr;

      _dimensionsInitialized = true; // 标记已初始化

      // 确保只在 TransformationController 未被显式设置过时（即初始状态）进行居中。
      // 初始状态时，_transformationController.value 是 Matrix4.identity()
      if (_transformationController.value == Matrix4.identity()) {
        _centerImage();
      }
    }
  }

  void _centerImage() {
    if (!mounted || !_dimensionsInitialized) return; // 确保 widget 仍然挂载且尺寸已初始化

    final screenWidth = MediaQuery.of(context).size.width;
    final screenHeight = MediaQuery.of(context).size.height;

    // 使用计算出的逻辑尺寸来居中
    final initialX = (screenWidth - _logicalImageWidth) / 2.0;
    final initialY = (screenHeight - _logicalImageHeight) / 2.0;

    _transformationController.value = Matrix4.identity()..translate(initialX, initialY);
  }

  void _resetView() {
    // 重置到居中状态
    // _centerImage 会使用正确的逻辑尺寸
    _centerImage();
  }

  @override
  Widget build(BuildContext context) {
    // 如果逻辑尺寸还未计算出来 (例如在第一帧)，可以显示一个加载指示器或占位符
    if (!_dimensionsInitialized) {
      // 在 didChangeDependencies 运行后，这里应该很快就会有值
      // 但为了健壮性，可以加一个判断
      return const Scaffold(
        appBar: null, // 或者与下面一致的 AppBar
        body: Center(child: CircularProgressIndicator()),
      );
    }

    return Scaffold(
      appBar: AppBar(
        title: const Text('Draggable Large Background'),
        actions: [
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: _resetView,
            tooltip: 'Reset View',
          )
        ],
      ),
      body: InteractiveViewer(
        transformationController: _transformationController,
        panEnabled: true,
        scaleEnabled: true,
        minScale: 0.1, // 允许缩小
        maxScale: 8.0, // 允许放大（可以根据需要调整，例如 dpr * 2）
        constrained: false,
        boundaryMargin: EdgeInsets.zero, // 拖动不超出图片边界
        child: Image.asset(
          imagePath,
          // 使用计算出的逻辑像素尺寸
          width: _logicalImageWidth,
          height: _logicalImageHeight,
          // BoxFit.fill 会拉伸图片以完全填充给定的逻辑宽高。
          // 因为我们是按照DPR计算的逻辑宽高，所以此时图片不会被不成比例地拉伸，
          // 而是以1:1像素对应（在1.0x缩放时）的方式填充这个逻辑区域。
          fit: BoxFit.fill,
          // 对于超大图片，可以考虑 filterQuality 来平衡性能和质量
          filterQuality: FilterQuality.low, // 在拖动缩放时可以更快，但静态时可能稍差
          // FilterQuality.medium 是默认值
          // FilterQuality.high 更清晰但更耗性能
        ),
      ),
    );
  }
}
